package com.maijinjie.common.bean;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 分页对象
 * @version 1.0
 * @author GhostarX ( 王欣逸 ) 100992995@qq.com
 * @param <T>
 */
public class Pagination<T> {
	/** 配置首页通用名称 */
	public static final int indexPageState = 1;
	/** 配置上一页通用名称 */
	public static final int previousPageState = 2;
	/** 配置下一页通用名称 */
	public static final int nextPageState = 3;
	/** 配置尾页通用名称 */
	public static final int lastPageState = 4;
	/** 配置跳转页通用名称 */
	public static final int goPageState = 5;
	
	/** 查询条件参数集 */
	Map<String, Object> paramMap = new HashMap<String, Object>();
	
	/** 当前页，初始化第1页 */
	private int page;
	/** 每页大小，每页初始化100条记录 */
	private int rows;
	
	/** 总记录数 */
	private int rowCount;
	/** 总页数 */
	private int pageCount;
	/** 开始行数 */
	private int startRow;
	/** 跳转页 */
	private int goPage;
	/** 记录集 */
	private List<T> list;
	/** 存储过程的参数集 */
	private HashMap<Integer, Object> hashMap;
	/** 状态 */
	private int state;
	/** 子结果集 */
	private Pagination<T> pageChildren;
	
	public Pagination(){
		this.page = 1;
		this.rows = 30;
	}
	
	/**
	 * 构造分页对象，默认第一页开始
	 * @param pageSize 指定多少条记录为一页
	 */
	public Pagination(int pageSize){
		this.page = 1;
		this.rows = pageSize;
	}
	
	/**
	 * 构造分页对象，指定当前页
	 * @param goPage 跳到第几页
	 * @param pageSize 指定多少条记录为一页
	 */
	public Pagination(int goPage, int pageSize){
		this.goPage = goPage;
		this.rows = pageSize;
		this.state = goPageState;
	}
	
	/**
	 * 获取当前请求页码
	 * @param p DaoPage对象
	 * @return int 当前请求页码
	 */
	public static int getInitPage(Pagination<?> p) {
		if(null == p) {
			p = new Pagination();
		} else {
			p.setPage(p.getPage() > 1 ? p.getPage() : 1);
			p.setPageCount(p.getPageCount() > 1 ? p.getPageCount() : 1);
			if (p.getState() != 0) {
				if (p.getState() == previousPageState) {
					if (p.getPage() > 1)
						p.setPage(p.getPage() - 1);
				} else if (p.getState() == indexPageState) {
					p.setPage(1);
				} else if (p.getState() == lastPageState) {
					p.setPage(p.getPageCount());
				} else if (p.getState() == nextPageState) {
					if (p.getPage() < p.getPageCount())
						p.setPage(p.getPage() + 1);
				} else if (p.getState() == goPageState) {
					p.setPage(p.getGoPage());
				}
			} else {
				p.setPage(1);
			}
		}
		return p.getPage();
	}
	
	/**
	 * 获取每页大小
	 * @param p DaoPage对象
	 * @return int 每页大小
	 */
	public static int getInitPageSize(Pagination<?> p) {
		if(null == p){
			p = new Pagination();
		}
		return p.getRows();
	}
	
	/**
	 * 获取数组形式的所有的分页对象
	 * @param p 分页对象
	 * @param n 分页对象里面总共有多少个分页对象
	 * @param size 每个显示多少条记录
	 * @return Pagination[]
	 */
	public static Pagination<?>[] getPaginations(Pagination<?> p, int n, int size){
		Pagination[] ps = new Pagination[n];
		Pagination tp = p;
		
		ps[0] = new Pagination(Pagination.getInitPage(tp), size);
		
		for(int i=1;i<n;i++){
			if(null!=tp.getPageChildren())
				tp = tp.getPageChildren();
			else
				tp = new Pagination(1, size);
			ps[i] = new Pagination(Pagination.getInitPage(tp), size);
		}
		return ps;
	}
	/**
	 * 获取开始行数
	 * @return int 开始行数
	 */
	public int getStartRow() {
		return startRow;
	}
	/**
	 * 设置开始行数
	 * @param startRow 开始行数
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setStartRow(int startRow) {
		this.startRow = startRow;
		return this;
	}
	/**
	 * 获取参数集（存储过程中用到）
	 * @return HashMap<Integer, Object> 参数集
	 */
	public HashMap<Integer, Object> getHashMap() {
		return hashMap;
	}
	/**
	 * 设置参数集（存储过程中用到）
	 * @param hashMap 参数集
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setHashMap(HashMap<Integer, Object> hashMap) {
		this.hashMap = hashMap;
		return this;
	}
	/**
	 * 获取总记录数
	 * @return int 总记录数
	 */
	public int getRowCount() {
		return rowCount;
	}
	/**
	 * 设置总记录数
	 * @param rowCount 总记录数
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setRowCount(int rowCount) {
		this.rowCount = rowCount;
		if (getRows() != 0)  //如果每页大小设置为0则不进行分页功能
			setPageCount((getRowCount() + getRows() - 1) / getRows());
		
		if (getPage() > getPageCount()) //设置当前页
			setPage(getPageCount());
		if (getPage() <= 0) 
			setPage(1);
		
		setStartRow((getPage() - 1) * getRows()); //设置开始行数 mysql的行数是从0开始算起，oracle的行数是从1开始算起。
		return this;
	}
	/**
	 * 获取总页数 
	 * @return int 总页数
	 */
	public int getPageCount() {
		return pageCount;
	}
	/**
	 * 设置总页数
	 * @param pageCount 总页数
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setPageCount(int pageCount) {
		this.pageCount = pageCount;
		return this;
	}
	/**
	 * 获取当前页码
	 * @return int 页码
	 */
	public int getPage() {
		return page;
	}
	/**
	 * 设置当前页码
	 * @param page 页码 
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setPage(Integer page) {
		this.page = (null==page||page<=0)?1:page;
		return this;
	}
	/**
	 * 获取每页大小
	 * @return int 大小
	 */
	public int getRows() {
		return rows;
	}
	/**
	 * 设置每页大小
	 * @param rows 大小 
	 * @return Pagination
	 */
	public Pagination<?> setRows(Integer rows) {
		if(null!=rows && 0<rows){
			this.rows = rows;
		}
		return this;
	}
	/**
	 * 获取跳转页码
	 * @return int 页码
	 */
	public int getGoPage() {
		return goPage;
	}
	/**
	 * 设置跳转页码（必须还要另外设置状态为跳转状态）
	 * @param goPage 页码
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setGoPage(int goPage) {
		this.goPage = goPage;
		return this;
	}
	/**
	 * 获取结果集
	 * @return List<HashMap<String, Object>>
	 */
	public List<T> getList() {
		return list;
	}
	/**
	 * 设置结果集
	 * @param list 结果集
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setList(List<T> list) {
		this.list = list;
		return this;
	}
	/**
	 * 获取状态
	 * @return int 状态码
	 */
	public int getState() {
		return state;
	}
	/**
	 * 设置状态
	 * @param state 状态
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setState(int state) {
		this.state = state;
		return this;
	}
	/**
	 * 获取子分页对象
	 * @return Pagination 分页对象
	 */
	public Pagination<?> getPageChildren() {
		return pageChildren;
	}
	/**
	 * 设置子分页对象
	 * @param pageChildren 子分页对象
	 * @return Pagination 分页对象
	 */
	public Pagination<?> setPageChildren(Pagination pageChildren) {
		this.pageChildren = pageChildren;
		return this;
	}
	/**
	 * 获取上一页页码
	 * @return int 上一页页码
	 */
	public int getPreviousPage(){
		if(1<this.getPage())
			return this.getPage()-1;
		else
			return 1;
	}
	/**
	 * 获取下一页页码
	 * @return int 下一页页码
	 */
	public int getNextPage(){
		if(this.getPageCount()>this.getPage())
			return this.getPage()+1;
		else
			return this.getPageCount();
	}
	/**
	 * 是否有上一页页码
	 * @return boolean true表示有，false表示无
	 */
	public boolean isHasPreviousPage(){
		if(1<this.getPage())
			return true;
		else
			return false;
	}
	/**
	 * 是否有下一页页码
	 * @return boolean true表示有，false表示无
	 */
	public boolean isHasNextPage(){
		if(this.getPageCount()>this.getPage())
			return true;
		else
			return false;
	}
	
	/**
	 * 设置查询条件的参数
	 * @param key 参数名
	 * @param value 参数值
	 * @version 1.0
	 * @author GhostarX ( 王欣逸 ) 100992995@qq.com 18902499340
	 * @data 2013-8-13 上午11:35:57
	 */
	public void setParam(String key, Object value) {
		this.paramMap.put(key, value);
	}
	/**
	 * 获取参数集
	 * @return Map<String, Object> 参数集
	 * @version 1.0
	 * @author GhostarX ( 王欣逸 ) 100992995@qq.com 18902499340
	 * @data 2013-8-13 上午11:36:17
	 */
	public Map<String, Object> getParamMap() {
		return paramMap;
	}
	/**
	 * 设置参数集
	 * @param paramMap 参数集
	 * @version 1.0
	 * @author GhostarX ( 王欣逸 ) 100992995@qq.com 18902499340
	 * @data 2013-8-13 上午11:36:24
	 */
	public void setParamMap(Map<String, Object> paramMap) {
		this.paramMap = paramMap;
	}
}
